#include "Token.h"
#include "unixHeader.h"

// 引入 OpenSSL 库提供的 MD5 实现所需的头文件
#include <openssl/md5.h>
#include <iostream>

// 自定义 Token 类的 const 成员函数，用于生成令牌（Token）
string Token::genToken() const
{
    // 将盐值 _salt 和用户名 _username 进行拼接，并存储在字符串 tmp 中。
    // 然后，使用 OpenSSL 提供的 MD5 函数计算 tmp 的 MD5 散列值，并将结果存储在 md 数组中
    string tmp = _salt + _username;
    unsigned char md[16] = {0};
    MD5((const unsigned char *)tmp.c_str(), tmp.size(), md);
    // 将 MD5 散列值转换为十六进制字符串
    char fragment[3] = {0};
    string result;
    for(int i = 0; i < 16; ++i) {
        // 将 md 数组中的每个字节转换为两个字符的十六进制字符串
        sprintf(fragment, "%02x", md[i]);
        result += fragment;
    }
    // 获取当前时间并格式化为字符串
    time_t secs = time(nullptr);
    struct tm  * ptm = localtime(&secs);
    char buff[15] = {0};
    sprintf(buff, "%04d%02d%02d%02d%02d%02d", 
            ptm->tm_year + 1900,
            ptm->tm_mon + 1,
            ptm->tm_mday,
            ptm->tm_hour,
            ptm->tm_min,
            ptm->tm_sec);
    // 将 MD5 散列值的十六进制字符串表示和当前时间的字符串表示连接起来，作为函数的返回值返回，即为生成的令牌
    return result + buff;
}
